import pandas as pd
from pyecharts import options as opts
from pyecharts.charts import Bar, Line, Timeline

# 读取数据，选择合适的编码格式
df = pd.read_csv('weather.csv', encoding='gb18030')

# 将日期列转化为日期格式
df['日期'] = pd.to_datetime(df['日期'].apply(lambda x: x.replace('年', '-').replace('月', '-').replace('日', '')))

# 提取月份信息
df['month'] = df['日期'].dt.month

# 处理温度数据：转化为数值类型并处理缺失值
# 假设 '最高/低温' 的格式为 '9℃/-1℃'，将其拆分为两个列
df['最高'] = df['最高/低温'].str.split('/').str[0]  # 取'最高'温度部分
df['最低'] = df['最高/低温'].str.split('/').str[1]  # 取'最低'温度部分

# 去除"℃"符号并转换为数值
df['最高'] = df['最高'].replace('℃', '', regex=True).astype(float)
df['最低'] = df['最低'].replace('℃', '', regex=True).astype(float)

# 处理缺失值：填充缺失值为平均值
df['最高'] = df['最高'].fillna(df['最高'].mean())
df['最低'] = df['最低'].fillna(df['最低'].mean())

# 按月份分组，计算每月的最大温度（最高）、最小温度（最低）
df_monthly_temp = df.groupby('month').agg({
    '最高': 'max',  # 计算每月的最大温度
    '最低': 'min',  # 计算每月的最小温度
    # '最高/低温': 'mean'  # 此列已经不再使用
}).reset_index()

# 打印每月的温度分析结果
print(df_monthly_temp)

# 创建时间轴对象
timeline = Timeline()
timeline.add_schema(play_interval=1000)  # 设置播放间隔为1秒（单位：ms）

# 循环处理每个月的数据，生成对应的图表
for month in df_monthly_temp['month']:
    # 获取当前月的温度数据
    monthly_data = df[df['month'] == month][['日期', '最高', '最低']]  # 获取每月的最高和最低温度

    # 获取每月的温度分析结果
    avg_temp = df_monthly_temp[df_monthly_temp['month'] == month]['最高'].mean()  # 平均温度
    max_temp = df_monthly_temp[df_monthly_temp['month'] == month]['最高'].values[0]
    min_temp = df_monthly_temp[df_monthly_temp['month'] == month]['最低'].values[0]

    # 打印每月的温度统计
    print(f"Month {month}: Avg Temp: {avg_temp:.2f}°C, Max Temp: {max_temp:.2f}°C, Min Temp: {min_temp:.2f}°C")

    # 创建折线图显示每月的温度波动趋势
    line = Line()
    line.add_xaxis([str(day.day) for day in monthly_data['日期']])  # 使用每月的日期作为X轴
    line.add_yaxis(f'温度 - {month}月', monthly_data['最高'].tolist(), is_smooth=True, color='red', label_opts=opts.LabelOpts(is_show=False))  # 最高温度折线
    line.add_yaxis(f'温度 - {month}月', monthly_data['最低'].tolist(), is_smooth=True, color='blue', label_opts=opts.LabelOpts(is_show=False))  # 最低温度折线

    # 设置标题，显示该月的平均温度、最大温度和最小温度
    line.set_global_opts(
        title_opts=opts.TitleOpts(title=f"2024年铜陵{month}月温度变化"),
        tooltip_opts=opts.TooltipOpts(trigger="axis"),
        xaxis_opts=opts.AxisOpts(name="日期"),
        yaxis_opts=opts.AxisOpts(name="温度 (°C)")
    )

    # 将当前折线图添加到时间轴
    timeline.add(line, f'{month}月')

# 将生成的时间轴图表保存为 HTML 文件
timeline.render('monthly_temperature_analysis.html')








